package cn.redbanners.httpclient_utils;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import cn.redbanners.pojos.SpiderFruit;

/**
 * 页面下载类
 * 
 * @param args
 *  hdmb by 2017/11/11
 */

public final class  downloadss {

	/* private static String respond; */

	/**
	 * 
	 * @param Url
	 * @return 爬虫结果类 SpiderFruit
	 * @return Content 页面下载方法
	 */

	// 模拟出真实的HTTP交互并获取图片
	/*
	 * 1.设置请求对象 User-Agnet httpGet.setHeader("User-Agent",
	 * "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"
	 * );
	 * 
	 * 2.获取响应内容类型 Content-Type HttpEntity entity = respond.getEntity();
	 * System.out.println(entity.getContentType().getValue());
	 * 
	 * 3.获取响应状态码 Status
	 *
	 * 200:正常 403:拒绝 500:服务器报错 400:未找到页面
	 * 
	 * CloseableHttpResponse respond = httpclient.execute(httpGet);
	 * System.out.println(respond.getStatusLine().getStatusCode());
	 *
	 * 4.复制资源： commons io 2.5 _Jar : 复制网络中的资源
	 * 
	 * 5.设置高匿IP 参考网站:http://www.xicidaili.com/nn/ HttpHost proxy=new
	 * HttpHost("175.155.213.235", 9999); RequestConfig
	 * config=RequestConfig.custom().setProxy(proxy).build();
	 * httpGet.setConfig(config);
	 *
	 * 6.设置连接超时,自动断连接,不会让程序一直连; RequestConfig config =
	 * RequestConfig.custom().setConnectTimeout(10000)// 设置连接时间超时10秒
	 * .setSocketTimeout(1000)// 设置读取时间超时10秒 .build(); httpGet.setConfig(config);
	 */

	// 传入的有代理IP就用代理IP
	public  static SpiderFruit getPageContent(String Url, String IP, Integer port) throws IOException {

		// 创建可关闭的HttpClient实例对象(新版本才可以)相当于创建了一个模拟浏览器
		CloseableHttpClient httpclient = HttpClients.createDefault();

		// 一般爬虫请求都用Get，Get请求在HTTP请求协议里代表安全的查看:这个请求对象里可以添加http的请求头等
		HttpGet httpGet = new HttpGet(Url);

		// 设置超时断连

		RequestConfig configDL = RequestConfig.custom().setConnectTimeout(10000)// 设置连接时间超时10秒断连
				.setSocketTimeout(10000)// 设置读取时间超时10秒断连
				.build();

		// 设置高匿IP
		HttpHost proxy = new HttpHost(IP, port);
		RequestConfig configIP = RequestConfig.custom().setProxy(proxy).build();

		// 添加请求配置

		httpGet.setConfig(configDL);
		httpGet.setConfig(configIP);

		// 设置Get请求头的 User-Agent (模拟代理浏览器信息)
		httpGet.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");

		// 用浏览器模拟对象httpClient，发送一个Get请求:可以通过这个响应对象获得很多http的响应信息
		CloseableHttpResponse respond = httpclient.execute(httpGet);
		
		//置空对象,提高速度
		httpGet=null;
		// 封装成一个爬虫结果类
		SpiderFruit SpiderFruit = new SpiderFruit();

		/*
		 * // 获得状态码 SpiderFruit.setStatusCode(respond.getStatusLine().getStatusCode());
		 * 
		 * // 获取返回的网页实体 HttpEntity entity = respond.getEntity(); if (entity != null) {
		 * // 设置响应内容类型 SpiderFruit.setContentType(entity.getContentType().getValue()); }
		 * 
		 * // 设置网页实体对象转换为字符串，并指定最终编码
		 * SpiderFruit.setEntitystr(EntityUtils.toString(entity, "utf-8"));
		 */

		// 关闭流资源
		httpclient.close();
		// 关闭流资源
		respond.close();
		return SpiderFruit;
	}

	// 如果传入的是URl则用原有的IP
	public static SpiderFruit getPageContent(String Url) throws IOException {

		// 创建可关闭的HttpClient实例对象(新版本才可以)相当于创建了一个模拟浏览器
		CloseableHttpClient httpclient = HttpClients.createDefault();

		// 一般爬虫请求都用Get，Get请求在HTTP请求协议里代表安全的查看:这个请求对象里可以添加http的请求头等
		HttpGet httpGet = new HttpGet(Url);

		// 设置高匿IP
/*		HttpHost proxy = new HttpHost("220.174.132.205",8888);
		RequestConfig configIP = RequestConfig.custom().setProxy(proxy).build();
httpGet.setConfig(configIP);*/
		// 设置超时断连
		RequestConfig configDL = RequestConfig.custom().setConnectTimeout(10000)// 设置连接时间超时10秒断连
				.setSocketTimeout(10000)// 设置读取时间超时10秒断连
				.build();

		// 添加请求配置
		httpGet.setConfig(configDL);
		
		
		// 设置Get请求头的 User-Agent (模拟代理浏览器信息)
		httpGet.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");

		// 用浏览器模拟对象httpClient，发送一个Get请求:可以通过这个响应对象获得很多http的响应信息
		CloseableHttpResponse respond = httpclient.execute(httpGet);
		
		//置空对象节省资源
		httpGet=null;
		
		// 封装成一个爬虫结果类
		SpiderFruit SpiderFruit = new SpiderFruit();

		// 获得状态码
		SpiderFruit.setStatusCode(respond.getStatusLine().getStatusCode());
		
		// 获取返回的网页实体
		HttpEntity entity = respond.getEntity();
		if (entity != null) {
			// 设置响应内容类型
			SpiderFruit.setContentType(entity.getContentType().getValue());
		}

		// 设置网页实体对象转换为字符串，并指定最终编码
		SpiderFruit.setEntitystr(EntityUtils.toString(entity, "utf-8"));

		// 关闭流资源
		httpclient.close();
		// 关闭流资源
		respond.close();
		return SpiderFruit;
	}

}
